/**
 * 提供子应用调用方法封装，mfe-sdk自定义方法实现
 * @author L
 * @since 2024-10-19 16:47:31
 */
import microApp from '@micro-zoe/micro-app'
// import store from '@/store'
import router from '@/router'
import { useUserToken } from "@/store/userStore";
import { notification } from 'antd'
import { eventBus } from '@/utils/EventBus';

function getQueryParams() {
  // 获取 URL 中的查询字符串部分
  const queryString = window.__MFE_ENV__ ? window.rawWindow.location.search : window.location.search
  // 创建一个对象来存储解析后的参数
  const params = {}
  // 检查查询字符串是否为空
  if (queryString) {
    // 去掉查询字符串中的问号
    const queryWithoutQuestionMark = queryString.substring(1)
    // 将查询字符串分割成键值对数组
    const pairs = queryWithoutQuestionMark.split('&')
    // 遍历每个键值对
    for (let i = 0; i < pairs.length; i++) {
      const pair = pairs[i].split('=')
      const key = decodeURIComponent(pair[0])
      const value = decodeURIComponent(pair[1] || '')
      // 将键值对添加到 params 对象中
      params[key] = value
    }
  }
  return params
}

export const getActions = (microAppName) => ({
  // 获取token
  token() {
    return useUserToken()
  },
  // 退出登录
  logout() {
    // 清空子应用数据缓存
    microApp.unmountAllApps({ destroy: true })
    // 登出
    // store.dispatch('Logout')
  },
  // 获取token
  getToken() {
    return Promise.resolve(useUserToken())
  },
  // 获取所有应用信息
  getAllApps() {
    return Promise.resolve([{ name: '子应用1' }, { name: '子应用2' }])
  },
  // 获取用户信息
  getUserInfo() {
    // 请求接口
    // return Promise.resolve(store.state.user.userInfo)
  },
  // 获取子应用信息
  getAppInfo(name = microAppName) {
    // 请求接口
    return new Promise((resolve) => {
      // resolve(store.state.user.userInfo)
    })
  },
  // 子应间页面跳转（包含菜单显示切换）
  /**
   *
   * @param {Object} param
   * @param {Boolean} outer
   * param.parentClientId 父应用编码
   * param.systemName 系统名称
   * param.menuUrl 应用地址
   * param.appCode 应用编码
   * param.menuCode 菜单编码
   * outer 为true时是新开窗口打开
   */
  routeTo(param, outer) {
    const query = getQueryParams()
    let passQuery = {}
    if (param.appCode && param.appCode !== query.menuTopId) {
      passQuery = { ...query, ...param, menuTopId: param.appCode, microApp: true } // 增加 microApp 参数
    } else {
      passQuery = { ...query, menuCode: param.menuCode }
    }
    if (param.parentClientId && param.parentClientId !== query.parentClientId) {
      passQuery.parentChange = true // 跨应用跳转
      delete passQuery.microApp
    }
    if (param.appCode === query.menuTopId && param.menuCode === query.menuCode) passQuery.timeStr = new Date().getTime() // 参数没变化的时候刷新页面
    if (outer) {
      window.open(router.resolve({
        path: '/index',
        query: passQuery
      }).href)
    } else {
      router.push({
        path: '/index',
        query: passQuery
      })
    }
  },
  openDialog({ content, visible, title }) {
    // store.dispatch('setMainAppDialogVisible', { content, visible, title })
  },
  // 获取主应用路由
  getBaseRoutes() {
    return Promise.resolve([])
  },
  // 获取子应用路由
  getAppRoutes() {
    // return Promise.resolve(store.state.app.appMenus)
  },
  // 获取子应用路由
  getPermissionData() {
    // return Promise.resolve(store.getters.permission)
  },
  // 日志上报
  sendLog(data) {
    console.log('上报数据 =>', data)
  },
  /**
   * 
   * @param {to} String 目标子应用名称
   * @param {from} String 来源子应用名称
   */
  sendMessageToApp(data) {
    if (data.to) {
      microApp.setData(data.to, { data, randomNum: Math.random() })
    }
  },
  listenData(cb) {
    microApp.addDataListener((data) => {
      console.log('监听数据 =>', data);

      cb(data)
    })
  },
  // 消息提示
  notification({ type = 'success', message, duration = 5 }) {
    notification[type]({
      message,
      duration
    })
  },
  // 全局弹窗
  /**
   * @param {Object} data
   * @param {String} data.title 弹窗标题
   * @param {String} data.className 弹窗类名
   * @param {ReactNode} data.content 弹窗内容
   * @param {ReactNode} data.footer 弹窗是否可见,底部内容，当不需要默认底部按钮时，可以设为 footer: null
   * @param {Number} data.width 弹窗宽度
   * @param {Number} data.height 弹窗高度
   * @param {String} data.okText 确定按钮文字
   * @param {String} data.cancelText 取消按钮文字
   * @param {Function} data.onOk 点击确定按钮的回调，需要再调用closeModal关闭弹窗，否则不关闭
   * @param {Function} data.onCancel 点击取消按钮的回调
   * @param {Function} data.afterClose 弹窗关闭后的回调
   */
  openModal(data) {
    eventBus.emit('openModal', data)
  },
  closeModal(data) {
    eventBus.emit('closeModal', data)
  },
})

export const initData = (name) => {
  microApp.forceSetData(name, getActions(name))
}
